#include "ipc/Ftok.h"
#include "ipc/Cola.h"
#include "ipc/Shm.h"
#include "ipc/EidList.h"
#include "log.h"
#include <stdlib.h>
#include <unistd.h>
#include "tcp/tcp.h"
#include "dtn/ConexionDTN.h"
#include <map>
#include "MensajesControl.h"

int main(int argc, char* argv[]){

    std::string path;
    path = ftok_crear_archivo("DTN");
    if(path.size()==0){
	clog(ROJO, "Error, no se pudo obtener el path para FTOK.\n");
	exit(-1);
    }

    std::string pathControl;
    pathControl = ftok_crear_archivo("DTNCONTROL");
    if(pathControl.size()==0){
	clog(ROJO, "Error, no se pudo obtener el path para FTOK (cola de control).\n");
	exit(-1);
    }

    std::string pathTicket;
    pathTicket = ftok_crear_archivo("Tickets");
    if(pathTicket.size()==0){
	clog(ROJO, "Error, no se pudo obtener el path para FTOK (ticketera).\n");
	exit(-1);
    }
    Ticketera ticketera(pathTicket.c_str(),1);

    ConexionDTN conexion("*");

    conexion.connect(""); //Escucho por todos los puertos

    conexion.bind();

    Cola cola(path.c_str(), 2);

    Cola colaControl(pathControl.c_str(), 1);

    EidList listaEids(path.c_str(), 1);

    std::vector<char> buffer;

    while(1){
	std::string origen;
	conexion.receive(buffer, origen);
	clog(AZUL, "Recibo un mensaje de la red (%s) y lo pongo en la cola.\n", origen.c_str());
	clog(VERDE, "%s", &buffer[0]);

 	EID eid = listaEids.obtener(origen.c_str());
	clog(BLANCO, "URIsize: %d\n", origen.size());

	clog(ROJO, "ID DEVUELTO %ld\n", eid.id);
	if(eid.id != 0)
	    cola.enviar(eid.id, buffer);
	else{
	    clog(AMARILLO, "Recibo un mensaje de alguien que no aparece en la tabla(%s).\n", origen.c_str());
	    struct MensajeControl *mc = (struct MensajeControl*)&buffer[0];
	    std::string nueva_ip=origen.substr(6,origen.find('/',6)-10);
	    clog(ROJO, "NUEVA IP %s\n", nueva_ip.c_str());
	    memset(mc->src_ip, 0, sizeof(mc->src_ip));
	    memcpy(mc->src_ip, nueva_ip.c_str(), strlen(nueva_ip.c_str()));

	    //obtengo nuevo ID de la ticketera 
	    long nuevoId= ticketera.siguiente();

	    //y mando el primer mensaje de control (el original) a la
	    //cola de control con ese ID
	    clog(MAGENTA,"Inserto %ld -> %s en la tabla\n", nuevoId, origen.c_str());
	    listaEids.insertar(nuevoId, origen.c_str());
	    eid = listaEids.obtener(origen.c_str());
	    if(eid.id != 0)
		clog(VERDE, "EID INSERTADO EXITOSAMENTE con id: %ld\n", eid.id);
	    else clog(ROJO, "EID NO INSERTADO\n");

	    colaControl.enviar(nuevoId, buffer);
	}
    }

    clog(ROJO,"El receptor finaliza.\n");
    return 0;
}
